修改材质球面板shader属性数值

您所在的位置:网站首页 unity shader debug 修改材质球面板shader属性数值

修改材质球面板shader属性数值

#修改材质球面板shader属性数值| 来源: 网络整理| 查看: 265

Shader 源代码下载: Unity 每次版本更新的时候,不单单会更新 Unity,配套的资源也是会一块更新 的,比如版本配套的 Shader 源代码。

一:下载步骤:

1.打开unity官网将纵向滑动条拉倒最底部点击红框区域【见图】

2.点击后还是将 纵向滑动条拉倒最底部点击红框区域【见图】

3.找到自己对应的unity版本点击红色区域即可【见图】 

 

 4.下载下来后是一个压缩包,解压之后双击打开文件夹找到DefaultResourcesExtra/Standard.shader使用记事本或者     notepad++打开就可以看到Shader的源码了!(备注:每个版本的着色器所存在的文件夹路径不同,我这边的unity版本是2017.2)

 

代码控制Shader面板的参数

相关 API 获取 Shader 中参数的值: material.GetFloat(“参数名”); //获取小数类型值; material.GetColor(“参数名”); //获取颜色类型值; material.GetTexture(“参数名”); //获取贴图类型值; 修改 Shadder 中参数的值: material.SetFloat(“参数名”,值); //设置小数类型值; material.SetColor(“参数名”,颜色值); //设置颜色类型值; material.SetTexture(“参数名”,贴图); //设置贴图类型值;

演示:将一个球体改变成红色

测试代码:

 最终效果:

 

代码动态修改材质球的颜色:

gameObject.GetComponent().material.color=Color.red;//当材质球的Shader为标准时,可直接使用此方法修改颜色值 gameObject.GetComponent().material //得到的material是经过实例化之后的material(Instantiate) Color color=new Color(0.5f,0.5f,0.5f,.0.5f);//修改颜色的RGB数值时,填入的值为float类型,且值为:数值/255 gameObject.GetComponent().material.SetColor("_TintColor",color);//若材质的Shader为Particles时,可使用此方法改变颜色

 

unity3d 用到 renderer.material.color.a 总是出现下面错误怎么解决?

Cannot modify a value type return value of `UnityEngine.Material.color' Consider storing the value in a temporary variable

//错误用法 renderer.material.color.a //正确用法 Color c = renderer.material.color; c.a = 0.4; renderer.material.color = c;

 

unity中代码使用(R,G,B)颜色值需要除255f,颜色值才会生效。

label.effectColor = new Color(39f / 255f, 83f / 255f, 150f / 255f);

 

 

我们知道在Unity中可以在代码中动态地改变Material监视面板中的参数,如改变数值大小或替换贴图。常用的API有:SetColor , SetFloat, SetInt, SetTexture.

然而今天在设置一个StandardShader的材质贴图的时候,发现设置了法线贴图但是场景中的物体并没有法线凹凸的效果,需要激活一下材质面板才行。经过反复检查以及查找资料,主要有以下两个问题:

// 贴图类型 string[] TEXTURE_TYPE = { "_MetallicGlossMap", "_BumpMap", "_ParallaxMap", "_OcclusionMap", "_DetailMask", "_DetailAlbedoMap", "_DetailNormalMap"}; // Material需要设置的关键字 string[] TEXTURE_KEYWORD = { "_METALLICGLOSSMAP", "_NORMALMAP", "_PARALLAXMAP", "", "_DETAIL_MULX2", "_DETAIL_MULX2", "_DETAIL_MULX2" };

法线贴图导入进来需要设置类型为NormalMap

// 设置法线贴图的类型 if (fileName == diffuseName + TEXTURE_TYPE[1]) { TextureImporter importer = (TextureImporter)AssetImporter.GetAtPath(filePath); importer.textureType = TextureImporterType.NormalMap; importer.SaveAndReimport(); }

使用标准着色器(StandardShader)的Material要设置启用相应的关键字

// 在Material.SetTexture之前 开启相应的KeyWord mat.EnableKeyword(TEXTURE_KEYWORD[i]);

以下是我查文档自己理解的,不一定准确。

一个Material所使用的标准着色器在Unity中其实是多个着色器的集合。因为一个材质的着色器不可能涵盖所有的功能,比如GI、雾效、HDR等高耗能的效果,所以Unity把标准着色器分成了带有不同特殊功能的着色器变体(Shader Variant)。当把NormalMap分配给材质,就是激活了支持法线贴图的着色器变体;把视差贴图分配给材质,就是激活了支持视差贴图的着色器变体。所以,如果要把某个特殊的贴图赋给材质,就要开启材质相应的关键字,以激活支持相应功能的着色器变体。

需要专门开启的关键字有以下几个:

关键字特性_NORMALMAP法线映射_ALPHATEST_ON用于CutOut渲染模式_ALPHABLEND_ON用于Fade渲染模式_ALPHAPREMULTIPLY_ON用于Transparent渲染模式_EMISSION设置自发光_PARALLAXMAP设置视差贴图_DETAIL_MULX2用于设置第二个贴图通道_METALLICGLOSSMAP在 Metallic工作流中设置金属度贴图_SPECGLOSSMAP在 Specular工作流中设置高光贴图

下面附上设置材质属性的部分代码:

/// /// 设置材质中shader的相关属性 /// 需要设置的Material /// 要传入shader的数据集合 /// 模型的名字,在这里主要是为了得到材质贴图文件夹的位置 /// void SetShader(Material mat, ShaderData data, string fbxName) { // 这里默认贴图资源中主贴图的名字就是材质名,其他贴图的名字是材质名+贴图类型 string diffuseName = mat.name; // textureFiles用于记录贴图文件夹中所有的图片文件,记录它们的贴图名和路径 Dictionary textureFiles = new Dictionary(); // texturePath是之前记录好的一个fbx模型对应的贴图文件夹的路径 string[] filesPath = Directory.GetFiles(texturePath[fbxName]); foreach (string filePath in filesPath) { // TEXTURE_EXT是预设的图片后缀名,用于标记图片格式(如.jpg,.png,.tif等) if (Array.IndexOf(TEXTURE_EXT, Path.GetExtension(filePath)) != -1) { string fileName = Path.GetFileNameWithoutExtension(filePath); if (fileName.IndexOf(diffuseName) == 0) { textureFiles[fileName] = filePath; Debug.Log(fileName + " , " + filePath); // 设置法线贴图的类型 if (fileName == diffuseName + TEXTURE_TYPE[1]) { TextureImporter importer = (TextureImporter)AssetImporter.GetAtPath(filePath); importer.textureType = TextureImporterType.NormalMap; importer.SaveAndReimport(); } } } } // 设置材质的主贴图,也就是Albedo贴图 if (textureFiles.ContainsKey(diffuseName)) { Debug.Log("MainTexture Exist"); mat.mainTexture = AssetDatabase.LoadAssetAtPath(textureFiles[diffuseName]); } // 设置其他特殊类型的贴图 for (int i = 0; i < TEXTURE_TYPE.Length; ++i) { if (textureFiles.ContainsKey(diffuseName + TEXTURE_TYPE[i])) { Debug.Log(TEXTURE_TYPE[i] + " Exist "); if (TEXTURE_KEYWORD[i] != "") mat.EnableKeyword(TEXTURE_KEYWORD[i]); mat.SetTexture(TEXTURE_TYPE[i], AssetDatabase.LoadAssetAtPath(textureFiles[diffuseName + TEXTURE_TYPE[i]])); } } mat.color = data.color; mat.SetFloat("_Metallic", data.metallic); mat.SetFloat("_Glossiness", data.glossiness); mat.SetColor("_EmissionColor", data.emissionColor); }

 

有时候我们可能会动态创建、或者加载一些物体需要改变一下物体的基本颜色,但是一个材质球我们可能用在很多物体上,所以就需要用到下边的这个方法;

 

using System.Collections; using System.Collections.Generic; using UnityEngine; public class SetMatColor : MonoBehaviour { private Material cubeMat;//使用代码动态创建 void Update() { if (Input.GetMouseButtonDown(0)) cubeMat = new Material(Shader.Find("Assets/NewMaterial1"));//在project窗口中找到这个shader脚本 Debug.Log("材质球名称:"+cubeMat.name); float r = 100 / 255; float g = 255 / 255; float b = 150 / 255; cubeMat.color = new Color(r, g, b, 1);//设置颜色(注意:new Color 的rgb的数值范围是0-1 ,无论你给rgb 设置的什么都要除于255,这样才是你在unity里面看到的颜色。 color32则是 0-255的数值范围) gameObject.GetComponent().material = cubeMat;//将设置的颜色赋给你的物体 } }

 

material.SetColor("_TintColor", new Color(0.133333333f, 0.04313725f, 0, Mathf.Min(0.5f, fadeTime += Time.deltaTime / 10)));

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3